package tuling.design.mode.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 观察者模式
 * 可以在运行时 添加对象 移除对象
 * 可以同时通知多个对象，只要该对象实现了观察者接口
 */
public class ObserverTest01 {
    public static void main(String[] args) {
        //创建任务
        Task01 task01 = new Task01();
        Task02 task02 = new Task02();
        Subject subject = new Subject();
        //创建主题
        subject.addObserver(task01);
        subject.addObserver(task02);
        //主题向任务发送消息
        subject.notifyObserver("请立即更新。。。。。");
        //移除任务1
        subject.removeObserver(task01);
    }
}

/**
 * 主题对象
 */
class Subject {
    //容器
    private List<Observer> container = new ArrayList<>();
    //添加容器的方法
    public void addObserver(Observer observer){
        container.add(observer);
    }
    //删除容器的方法
    public void removeObserver(Observer observer){
        container.remove(observer);
    }
    //消息通知的方法
    public void notifyObserver(Object notify){
        for (Observer observer1 : container) {
            observer1.notifyData(notify);
        }
    }
}

/**
 * 观察者接口可以有多个实现类
 */
interface Observer{
    //被通知的方法
    void notifyData(Object note);
}

/**
 * 任务1
 */
class Task01 implements Observer{

    @Override
    public void notifyData(Object note) {
        System.out.println("任务1收到通知。。。。: " + note);
    }
}

/**
 * 任务1
 */
class Task02 implements Observer{

    @Override
    public void notifyData(Object note) {
        System.out.println("任务2收到通知。。。。: " + note);
    }
}